perm filename GRADER.SAI[4,KMC]1 blob sn#177290 filedate 1975-09-17 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00005 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN
C00004 00003	PROC OUT_BOTH(VALUE STRING LINE)
C00006 00004	PROC GRADE
C00009 00005	BLANKS ← "...................................."
C00010 ENDMK
C⊗;
BEGIN

REQUIRE "IODEFS.SAI[SEC,RCP]" SOURCE_FILE;

SAFE INTEGER ARRAY GD_VAL, DISTRIB [1:15];
SAFE STRING ARRAY GD_NAME [1:15];
SAFE REAL ARRAY GD_PCT [1:15];
INTEGER POSSIBLE, STUDENTS;
STRING PER;

α Should just accept grades, then select grading percentages to give desired
  fractions of each letter grade (or just produce normal distribution).

PROC ALTER_PCT;
	BEGIN
	FOR I ← 1 TIL 15 DO
		BEGIN
		OUTSTR(GD_NAME[I] ∂ "=" ∂ CVS(ROUND(GD_PCT[I]*100)) & "% ↑" ↓);
		DISTRIB[I] ← 0;
		END;
	WHILE GET_A_STRING("Do you approve [Y,N]") = "N" DO
		FOR I ← 1 TIL 12 DO
			BEGIN
			INTEGER PCT;
			PCT ← GET_AN_INT(GD_NAME[I] ∂ "=");
			IF PCT > 0 THEN GD_PCT[I] ← PCT / 100;
			END;
	FOR I ← 1 TIL 15 DO
		GD_VAL[I] ← ROUND(GD_PCT[I] * POSSIBLE);
	END;

INTEGER PROC GET_SUM(VALUE STRING QUESTION);
	BEGIN
	STRING LINE;
	INTEGER SUM;
	LINE ← GET_A_STRING(QUESTION);
	SUM ← 0;
	DO SUM ← SUM + INTSCAN(LINE, BRK) UNTIL BRK = -1;
	RETURN(SUM);
	END;

PROC INIT_PCT;
	BEGIN
	STRING GN, GV;
	GN ← "A+A A-B+B B-C+C C-D+D D-F INNG";
	GV ← ".98 .92 .9 .88 .85 .8 .78 .72 .68 .66 .64 .6 .4 .01 0";
	FOR I ← 1 TIL 15 DO
		BEGIN
		GD_NAME[I] ← GN[2*I-1 FOR 2];
		GD_PCT[I] ← REALSCAN(GV, BRK);
		END;
	END;
PROC OUT_BOTH(VALUE STRING LINE);
	BEGIN
	OUTSTR(LINE ↓);
	OUT_LINE(LINE ↓);
	END;

PROC PRINT_DISTRIB;
	BEGIN
	FILOUT("DISTRI." & PER, OUCH1);
	OUT_BOTH("Grade distribution for period" ∂ PER ↓);
	FOR I ← 2 STEP 3 UNTIL 11 DO
		BEGIN
		INTEGER J, SUM;
		SUM ← 0;
		FOR J ← -1 TIL 1 DO
			BEGIN
			SUM ← SUM + DISTRIB[I+J];
			OUT_BOTH(GD_NAME[I+J] ∂ ":" ∂ CVS(DISTRIB[I+J]));
			END;
		OUT_BOTH(TAB & TAB & GD_NAME[I] ∂ "=" ∂
			CVS(ROUND(SUM * 100.0 / STUDENTS)) & "%");
		END;
	FOR I ← 13 TIL 15 DO
		BEGIN
		OUT_BOTH(GD_NAME[I] ∂ ":" ∂ CVS(DISTRIB[I]));
		OUT_BOTH(TAB & TAB & GD_NAME[I] ∂ "=" ∂
			CVS(ROUND(DISTRIB[I] * 100.0 / STUDENTS)) & "%");
		END;
	RELEASE(OUCH1);
	END;
PROC GRADE;
	BEGIN
	STRING NAME;
	DO POSSIBLE ← GET_SUM("Points possible")
	UNTIL GET_A_STRING(CVS(POSSIBLE) ∂ "OK [Y,N]") = "Y";
	INIT_PCT;
	ALTER_PCT;
	FILIN("PERIOD." & PER, INCH1);
	FILOUT("GRADES." & PER, OUCH1);
	STUDENTS ← 0;
	WHILE (NAME ← IN_LINE) DO
		BEGIN "Student"
		INTEGER POINTS;
		STRING L_NAME;
		L_NAME ← SCAN(NAME, 8, BRK);
		STUDENTS ← STUDENTS + 1;
		DO	BEGIN
			POINTS ← GET_SUM(NAME ∂ L_NAME);
			I ← 1;
			WHILE POINTS < GD_VAL[I] DO I ← I + 1;
			END
		UNTIL GET_A_STRING(CVS(POINTS) ∂ "=" ∂ GD_NAME[I]) = "Y";
		DISTRIB[I] ← DISTRIB[I] + 1;
		OUT_LINE(LEFTJ(20, L_NAME & "," & NAME) &
			LEFTJ(4,CVS(POINTS)) ∂ "=" ∂ GD_NAME[I]);
		FOR I ← 1 TIL 4 DO NAME ← IN_LINE;
		END "Student";
	RELEASE(INCH1);
	RELEASE(OUCH1);
	PRINT_DISTRIB;
	WHILE GET_A_STRING("Do you like this distribution") = "N" DO
		BEGIN "Redistrib"
		STRING LINE;
		ALTER_PCT;
		FILIN("GRADES." & PER, INCH1);
		FILOUT("TEMP." & PER, OUCH1);
		WHILE (LINE ← IN_LINE) DO
			BEGIN "Line"
			INTEGER POINTS;
			POINTS ← CVD(LINE[21 FOR 4]);
			I ← 1;
			WHILE POINTS < GD_VAL[I] DO I ← I + 1;
			DISTRIB[I] ← DISTRIB[I] + 1;
			OUT_LINE(LINE[1 FOR 27] & GD_NAME[I]);
			END "Line";
		RENAME(INCH1, NULL, 0, FLAG);
		RELEASE(INCH1);
		RENAME(OUCH1, "GRADES." & PER, 5, FLAG);
		RELEASE(OUCH1);
		PRINT_DISTRIB;
		END "Redistrib";
	END;
BLANKS ← "....................................";
BREAK_LINE;
BREAK_COMMA;
WHILE (PER ← GET_A_STRING("Period # [<CR> for none]")) DO GRADE;

END